package itsur.arquitecturas.implicitinvocation;

/**************************************************************************************
** Class name: ListCoursesRegistered
** Author: A.J. Lattanze
** Date: 12/29/99
** Version 1.0
***************************************************************************************
** Purpose: Assignment 3 for SE 17-655, Architectures for Software Systems. This is a
** standalone thread that will list the courses a student has registered for.
**
** Abstract: Upon notification, this thread will first list the students and ask the
** user to pick a student and enter the student's ID.  If the student's ID is valid,
** then the courses that the student has registered for will be listed.
**
** Modification Log
**************************************************************************************
** Modification by: A.J. Lattanze
** Date: 01/24/02
** Version 1.5
** Description: This class has been changed to run as a stand-alone thread. This
** method was changed to implement the Runnable class so that it could run as a thread.
** While, this has little impact on the architecture, it illustrates a multi-threaded
** event model.
**************************************************************************************/
import java.util.*;

public class ListCoursesRegistered extends Communication implements Runnable
{
	boolean Stop = false;

	public ListCoursesRegistered( Integer RegistrationNumber, String ComponentName )
	{
		super( RegistrationNumber, ComponentName  );

	} // Constructor

	public void update( Observable Thing, Object NotificationNumber )
	{
		Menus Menu = new Menus();
		Displays Display = new Displays();
		Student MyStudent = new Student();

		// The update() method is an abstract method that is called whenever the
		// notifyObservers() method is called by the Observable class
		// First we check to see if the NotificationNumber is equal to this
		// thread's RegistrationNumber or SYSTEM_SHUT_DOWN.  If they are, then we
		// execute - otherwise, we stay idle.

		if ( RegistrationNumber.compareTo(NotificationNumber) == 0 )
		{
			// First we use a Displays object to list all of the students. Then we
			// ask the user to pick a student using a Menus object.

			AddToReceiverList( "ListStudentsComponent" );

			SignalReceivers( "ListStudentsComponent" );

			MyStudent = Menu.PickStudent( SystemData.TheListOfStudents.ListOfStudents );

			// If the user selected an invalid student, then a message is printed to the
			// terminal.

			if ( MyStudent != null )
			{
				Display.DisplayStudentCoursesRegistered( MyStudent );

			} else {

				System.out.println( "\n\n *** Student not found ***" );

			} // if

		} // if

		if ( SYSTEM_SHUT_DOWN_ID.compareTo(NotificationNumber) == 0 )
		{
			Stop = true;

		} // if

		RemoveFromReceiverList( "ListStudentsComponent" );

	} // update


	public void run()
	{
		System.out.println( "\nListCoursesRegistered Component Started..." );

   		try
   		{
   			while(!Stop)
			{

				// Note this is something of a farce here.  In order to start each
 				// component as a separate thread, the run() method must be implemented.
                // To illustrate how run() could be used here I put some code here.We really
               	// don't do anything here,.. but we could.  If we were doing things here,
               	// whatever it was that we were doing would be interrupted when an event
               	// from the executive arrived, and the update() method we would immediately
               	// execute. Currently we wait forever (by 1 second increments).  Please feel
               	// free to put code if if you thing you need to (not to imply that you will
               	// need to).

               	Thread.sleep( 1000 );

			} // while

			System.out.println( "\nListCoursesRegistered Component Shutdown..." );

		} catch (Exception e) {

			System.out.println( "Exception occured in ListCoursesRegistered.run(): " + e);

		}  // try-catch

	} // run
} // ListCoursesRegistered